﻿using System;
using System.Data;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;

namespace Emporium_Web
{
    public partial class VariantesXEstilo : System.Web.UI.Page
    {
        private int IdSeleccionado
        {
            get { return (int)ViewState["IdSeleccionado"]; }
            set { }
        }

        /// <summary>
        /// Es el código de estilo
        /// </summary>
        private int EstiloId
        {
            get { return ViewState["RequestCodeEstilo"] == null ? -1 : (int)ViewState["RequestCodeEstilo"]; }
            set { ViewState["RequestCodeEstilo"] = value; }
        }

        /// <summary>
        /// Las combinaciones.
        /// </summary>
        private List<TG_Combinacion> CombinacionesTemp
        {
            get
            {
                return Session["CombinacionesTemp"] == null ? null : (List<TG_Combinacion>)Session["CombinacionesTemp"];
            }
            set
            {
                Session["CombinacionesTemp"] = value;
            }
        }

        /// <summary>
        /// Las combinaciones.
        /// </summary>
        private List<TG_Talla> TallasTemp
        {
            get
            {
                return Session["TallasTemp"] == null ? null : (List<TG_Talla>)Session["TallasTemp"];
            }
            set
            {
                Session["TallasTemp"] = value;
            }
        }

        protected void Page_Init(object sender, EventArgs e)
        {
            combinacionAdd.agregarClick += new EventHandler(agregarCombinacion_Click);
            tallaAdd.agregarClick += new EventHandler(agregarTalla_Click);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            warningMessage.Visible = false;
            errorMessage.Visible = false;

            if (!IsPostBack)
            {
                Master.ActualizaMenu(MenuPrincipal.Desarrollo, (int)MenuDesarrollo.Estilo);
                Master.AgregarBreadcrumb("Estilos", "#", true);
                Master.AgregarBreadcrumb("Listado", "EstiloList.aspx", false);
                Master.AgregarBreadcrumb("Variantes por Estilo", "#", false);

                int EstiloId = 0;
                if (Request.QueryString["EstiloId"] != null && Int32.TryParse(Request.QueryString["EstiloId"], out EstiloId))
                {
                    this.EstiloId = EstiloId;
                    TablasDataContext database = new TablasDataContext();

                    var estilo = (from estilos in database.DE_Estilo
                                  where estilos.Id == EstiloId
                                  select estilos).First();

                    this.txtEstilo.Text = estilo.Descripcion;
                }

                CombinacionesTemp = new List<TG_Combinacion>();
                TallasTemp = new List<TG_Talla>();

                ListarVariantes();                
                ListarCombinaciones();
                CargarCombinaciones();
                ListarTallas();
                CargarTallas();
            }
        }

        private void ListarVariantes()
        {
            TablasDataContext database = new TablasDataContext();

            var listaVariantes = (from variantes in database.DE_Variante
                                  where (variantes.Estilo_Id == EstiloId)
                                  select variantes);

            if (listaVariantes.Count() > 0)
            {
                gvVariantes.DataSource = listaVariantes;
                gvVariantes.DataBind();
            }
            else
            {
                AgregarFilaVacia();
                gvVariantes.Rows[0].Visible = false;
            }

            EstablecerValidaciones();
        }

        private void ListarCombinaciones()
        {
            TablasDataContext database = new TablasDataContext();

            var listaCombinaciones = from combinaciones in database.TG_Combinacion
                                     join estiloCombinaciones in database.DE_EstiloCombinacion
                                     on combinaciones.Combinacion_Id equals estiloCombinaciones.Combinacion_Id
                                     where estiloCombinaciones.Estilo_Id == this.EstiloId
                                     select combinaciones;

            if (listaCombinaciones.Count() > 0)
                CombinacionesTemp = listaCombinaciones.ToList();            
        }

        private void CargarCombinaciones()
        {
            if (CombinacionesTemp.Count() > 0)
            {
                gvCombinaciones.DataSource = CombinacionesTemp;
                gvCombinaciones.DataBind();
            }
            else
            {
                gvCombinaciones.DataSource = new List<TG_Combinacion>() { new TG_Combinacion() };
                gvCombinaciones.DataBind();
                gvCombinaciones.Rows[0].Cells[0].Text = string.Empty;
                gvCombinaciones.Rows[0].Cells[1].Text = string.Empty;
            }
        }

        private void ListarTallas()
        {
            TablasDataContext database = new TablasDataContext();

            var listaTallas = from estilosTallas in database.DE_EstiloTalla
                              join tallas in database.TG_Talla
                              on estilosTallas.Talla_Id equals tallas.Talla_Id                           
                              where estilosTallas.Estilo_Id == this.EstiloId
                              select tallas;

            if (listaTallas.Count() > 0)
                TallasTemp = listaTallas.ToList();        
        }

        private void CargarTallas()
        {
            if (TallasTemp.Count() > 0)
            {
                gvTallas.DataSource = TallasTemp;
                gvTallas.DataBind();
            }
            else
            {
                gvTallas.DataSource = new List<TG_Talla>() { new TG_Talla() };
                gvTallas.DataBind();
                gvTallas.Rows[0].Cells[0].Text = string.Empty;
                gvTallas.Rows[0].Cells[1].Text = string.Empty;
            }
        }
       

        /// <summary>
        /// Agrega una fila vacía al grid de Imagenes.
        /// </summary>
        /// <param name="gv"></param>
        private void AgregarFilaVacia()
        {
            DataTable source = new DataTable();

            source.Columns.Add("Variante_Id");
            source.Columns.Add("Estilo_Id");
            source.Columns.Add("Variante_Secuencia");
            source.Columns.Add("Variante_Descripcion");
            source.Columns.Add("Variante_Estado");
            source.Columns.Add("Variante_FechaRegistro");

            source.Rows.Add(source.NewRow());

            gvVariantes.DataSource = source;
            gvVariantes.DataBind();
        }

        protected void btnAtras_Click(object sender, EventArgs e)
        {
            Response.Redirect("EstiloList.aspx");
        }

        protected void gvVariantes_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            int varianteId = Convert.ToInt32(e.Keys["Variante_Id"]);
            TextBox txtDescripcion = (TextBox)gvVariantes.Rows[e.RowIndex].FindControl("txtDescripcion");

            TablasDataContext database = new TablasDataContext();

            var colores = (from combinacionColor in database.DE_VarianteItemCombinacionColor
                         where combinacionColor.Variante_Id == varianteId
                         select combinacionColor);
            foreach (var item in colores)
            {
                database.DE_VarianteItemCombinacionColor.DeleteOnSubmit(item);
            }

            var items = (from varianteItems in database.DE_VarianteItem
                               where varianteItems.Variante_Id == varianteId
                               select varianteItems);
            foreach (var item in items)
            {
                database.DE_VarianteItem.DeleteOnSubmit(item);
            }

            var componentes = (from varianteComponente in database.DE_VarianteComponente
                           where varianteComponente.Variante_Id == varianteId
                           select varianteComponente);
            foreach (var item in componentes)
            {
                database.DE_VarianteComponente.DeleteOnSubmit(item);
            }

            var estilo = (from estilos in database.DE_Estilo
                          where estilos.Id == EstiloId
                          select estilos).First();

            var varianteActual = (from variantes in database.DE_Variante
                                  where (variantes.Variante_Id == varianteId)
                                  select variantes).First();

            database.DE_Variante.DeleteOnSubmit(varianteActual);
            database.SubmitChanges();
            ListarVariantes();
        }

        protected void gvVariantes_RowEditing(object sender, GridViewEditEventArgs e)
        {
            gvVariantes.EditIndex = e.NewEditIndex;
            ListarVariantes();
        }

        protected void gvVariantes_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            int varianteId = Convert.ToInt32(e.Keys["Variante_Id"]);
            TextBox txtDescripcion = (TextBox)gvVariantes.Rows[e.RowIndex].FindControl("txtDescripcion");
            DropDownList ddlEditEstado = (DropDownList)gvVariantes.Rows[e.RowIndex].FindControl("ddlEditEstado");

            TablasDataContext database = new TablasDataContext();
            var varianteActual = (from variantes in database.DE_Variante
                                  where (variantes.Variante_Id == varianteId)
                                  select variantes).First();

            varianteActual.Variante_Descripcion = txtDescripcion.Text;
            varianteActual.Variante_Estado = ddlEditEstado.SelectedValue[0];

            database.SubmitChanges();

            gvVariantes.EditIndex = -1;
            ListarVariantes();
        }

        protected void gvVariantes_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName.Equals("Insert"))
            {
                TextBox txtDescripcion = (TextBox)gvVariantes.FooterRow.FindControl("txtNewDescripcion");

                TablasDataContext database = new TablasDataContext();
                var estilo = (from estilos in database.DE_Estilo
                              where estilos.Id == EstiloId
                              select estilos).First();

                estilo.DE_Variante.Add(new DE_Variante()
                {
                    Estilo_Id = this.EstiloId,
                    Variante_Descripcion = txtDescripcion.Text,
                    Variante_Estado = 'R',
                    Variante_FechaRegistro = DateTime.Now.Date,
                    Variante_Secuencia = estilo.DE_Variante.Count + 1
                });
                database.SubmitChanges();

                ListarVariantes();
            }
        }

        protected void gvVariantes_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            gvVariantes.EditIndex = -1;
            ListarVariantes();
        }

        /// <summary>
        /// Llena los mensajes de error de las validaciones del formulario.
        /// </summary>
        private void EstablecerValidaciones()
        {
            if (gvVariantes.FooterRow != null)
            {
                RequiredFieldValidator reqDescripcionVariante = (RequiredFieldValidator)gvVariantes.FooterRow.FindControl("reqNewDescripcion");
                reqDescripcionVariante.Text = Resources.MensajesValidacion.RequiredField;
            }
            if (gvVariantes.EditIndex > -1)
            {
                RequiredFieldValidator reqDescripcionVariante = (RequiredFieldValidator)gvVariantes.Rows[gvVariantes.EditIndex].FindControl("reqEditDescripcion");
                if (reqDescripcionVariante != null)
                    reqDescripcionVariante.Text = Resources.MensajesValidacion.RequiredField;
            }
        }

        protected void gvVariantes_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                Label lblEstado = (Label)e.Row.FindControl("lblEstado");
                if (lblEstado != null && lblEstado.Text != string.Empty)
                {
                    lblEstado.Text = lblEstado.Text.ToString()[0] == 'R' ? "REGISTRADO" : "OPERATIVO";
                }
            }
        }

        protected void btnCombinacionesAdicionar_Click(object sender, EventArgs e)
        {
            combinacionAdd.ListarCombinaciones();
        }

        protected void btnCombinacionesEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                int codigo = 0;
                if (Int32.TryParse(hdnSeleccionCmb.Value.ToString(), out codigo))
                {
                    var combinacion = CombinacionesTemp.Find(c=>c.Combinacion_Id == codigo);
                    CombinacionesTemp.Remove(combinacion);
                    CargarCombinaciones();
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnCombinacionesGrabar_Click(object sender, EventArgs e)
        {
            try
            {

                TablasDataContext database = new TablasDataContext();
                var combinacionesActuales = from combinaciones in database.TG_Combinacion
                                            join estilosCombinaciones in database.DE_EstiloCombinacion
                                            on combinaciones.Combinacion_Id equals estilosCombinaciones.Combinacion_Id
                                            where estilosCombinaciones.Estilo_Id == this.EstiloId
                                            select estilosCombinaciones;

                //Se elimana las combinaciones
                foreach (var item in combinacionesActuales)
                {
                    if (!CombinacionesTemp.Exists(c => c.Combinacion_Id == item.Combinacion_Id))
                    {
                        database.DE_EstiloCombinacion.DeleteOnSubmit(item);
                    }
                }

                //Se insertan las combinaciones
                foreach (var itemTemp in CombinacionesTemp)
                {
                    var combinacion = database.DE_EstiloCombinacion.FirstOrDefault(c => c.Combinacion_Id == itemTemp.Combinacion_Id && c.Estilo_Id == this.EstiloId);
                    if (combinacion == null)
                    {
                        database.DE_EstiloCombinacion.InsertOnSubmit(new DE_EstiloCombinacion()
                        {
                            Estilo_Id = this.EstiloId,
                            Combinacion_Id = itemTemp.Combinacion_Id
                        });
                    }
                }
                database.SubmitChanges();
                CargarCombinaciones();
                lblWarningMessage.Text = "Combinaciones fueron guardadas exitosamente.";
                warningMessage.Visible = true;
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }
                
        protected void agregarCombinacion_Click(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            var combinacion = (from combinaciones in database.TG_Combinacion
                               where combinaciones.Combinacion_Id == combinacionAdd.CodigoSeleccionado
                               select combinaciones).First();
            if(!CombinacionesTemp.Exists(c=>c.Combinacion_Id == combinacionAdd.CodigoSeleccionado))
            {
                CombinacionesTemp.Add(combinacion);
                CargarCombinaciones();
            }
        }

        protected void btnTallasAdicionar_Click(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            var estilo = database.DE_Estilo.First(c => c.Id == this.EstiloId);
            tallaAdd.GrupoId = estilo.GruTal_Id;
            tallaAdd.ListarTallas();
        }

        protected void btnTallasEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                int codigo = 0;
                if (Int32.TryParse(hdnSeleccionTal.Value.ToString(), out codigo))
                {
                    var talla = TallasTemp.Find(c => c.Talla_Id == codigo);
                    TallasTemp.Remove(talla);
                    CargarTallas();
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnTallasGrabar_Click(object sender, EventArgs e)
        {
            try
            {

                TablasDataContext database = new TablasDataContext();
                var combinacionesActuales = from tallas in database.TG_Talla
                                            join estilosTallas in database.DE_EstiloTalla
                                            on tallas.Talla_Id equals estilosTallas.Talla_Id
                                            where estilosTallas.Estilo_Id == this.EstiloId
                                            select estilosTallas;

                //Se elimana las combinaciones
                foreach (var item in combinacionesActuales)
                {
                    if (!TallasTemp.Exists(c => c.Talla_Id == item.Talla_Id))
                    {
                        database.DE_EstiloTalla.DeleteOnSubmit(item);
                    }
                }

                //Se insertan las combinaciones
                foreach (var itemTemp in TallasTemp)
                {
                    var combinacion = database.DE_EstiloTalla.FirstOrDefault(c => c.Talla_Id == itemTemp.Talla_Id && c.Estilo_Id == this.EstiloId);
                    if (combinacion == null)
                    {
                        database.DE_EstiloTalla.InsertOnSubmit(new DE_EstiloTalla()
                        {
                            Estilo_Id = this.EstiloId,
                            Talla_Id = itemTemp.Talla_Id
                        });
                    }
                }
                database.SubmitChanges();
                CargarTallas();
                lblWarningMessage.Text = "Tallas fueron guardadas exitosamente.";
                warningMessage.Visible = true;
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void agregarTalla_Click(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            var talla = database.TG_Talla.First(c => c.Talla_Id == tallaAdd.CodigoSeleccionado);
                               
            if (!TallasTemp.Exists(c => c.Talla_Id == tallaAdd.CodigoSeleccionado))
            {
                TallasTemp.Add(talla);
                CargarTallas();
            }
        }
    }
}